package com.showdor.utils;

/**
 * @author showdor
 * @email chuanqi@outlook.com
 * @date 2025/1/9
 */
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimestampRangeUtil {

    // 时间格式化工具
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) {
        long timestamp = System.currentTimeMillis(); // 当前时间戳（毫秒）
        System.out.println("当前时间: " + DATE_FORMAT.format(new Date(timestamp)));

        // 按 5 分钟获取开始和结束时间
        String[] fiveMinuteRange = getFiveMinuteRange(timestamp);
        System.out.println("按 5 分钟范围: " + fiveMinuteRange[0] + " - " + fiveMinuteRange[1]);

        // 按小时获取开始和结束时间
        String[] hourlyRange = getHourlyRange(timestamp);
        System.out.println("按小时范围: " + hourlyRange[0] + " - " + hourlyRange[1]);

        // 按天获取开始和结束时间
        String[] dailyRange = getDailyRange(timestamp);
        System.out.println("按天范围: " + dailyRange[0] + " - " + dailyRange[1]);
    }

    /**
     * 按 5 分钟获取开始和结束时间
     *
     * @param timestamp 毫秒级时间戳
     * @return 开始时间和结束时间
     */
    public static String[] getFiveMinuteRange(long timestamp) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp);

        // 对齐到最近的 5 分钟
        int minute = calendar.get(Calendar.MINUTE);
        int remainder = minute % 5;
        calendar.add(Calendar.MINUTE, -remainder);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        // 开始时间
        String startTime = DATE_FORMAT.format(calendar.getTime());

        // 结束时间（开始时间 + 5 分钟）
        calendar.add(Calendar.MINUTE, 5);
        String endTime = DATE_FORMAT.format(calendar.getTime());

        return new String[]{startTime, endTime};
    }

    /**
     * 按小时获取开始和结束时间
     *
     * @param timestamp 毫秒级时间戳
     * @return 开始时间和结束时间
     */
    public static String[] getHourlyRange(long timestamp) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp);

        // 对齐到当前小时的开始时间
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        // 开始时间
        String startTime = DATE_FORMAT.format(calendar.getTime());

        // 结束时间（开始时间 + 1 小时）
        calendar.add(Calendar.HOUR_OF_DAY, 1);
        String endTime = DATE_FORMAT.format(calendar.getTime());

        return new String[]{startTime, endTime};
    }

    /**
     * 按天获取开始和结束时间
     *
     * @param timestamp 毫秒级时间戳
     * @return 开始时间和结束时间
     */
    public static String[] getDailyRange(long timestamp) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp);

        // 对齐到当天的开始时间
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        // 开始时间
        String startTime = DATE_FORMAT.format(calendar.getTime());

        // 结束时间（开始时间 + 1 天）
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        String endTime = DATE_FORMAT.format(calendar.getTime());

        return new String[]{startTime, endTime};
    }
}